/*
 * @Author: liusheng
 * @Date: 2022-04-24 17:37:32
 * @LastEditors: liusheng
 * @LastEditTime: 2022-04-26 20:29:13
 * @Description: 剑指 Offer II 041. 滑动窗口的平均值
 * email:liusheng613@126.com
 * Copyright (c) 2022 by liusheng/liusheng, All Rights Reserved. 
 剑指 Offer II 041. 滑动窗口的平均值
给定一个整数数据流和一个窗口大小，根据该滑动窗口的大小，计算滑动窗口里所有数字的平均值。

实现 MovingAverage 类：

MovingAverage(int size) 用窗口大小 size 初始化对象。
double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数，请计算并返回数据流中最后 size 个值的移动平均值，即滑动窗口里所有数字的平均值。
 

示例：

输入：
inputs = ["MovingAverage", "next", "next", "next", "next"]
inputs = [[3], [1], [10], [3], [5]]
输出：
[null, 1.0, 5.5, 4.66667, 6.0]

解释：
MovingAverage movingAverage = new MovingAverage(3);
movingAverage.next(1); // 返回 1.0 = 1 / 1
movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
 

提示：

1 <= size <= 1000
-105 <= val <= 105
最多调用 next 方法 104 次
 

注意：本题与主站 346 题相同： https://leetcode-cn.com/problems/moving-average-from-data-stream/
 */

#include "header.h"

/*
because if invoke next time's bigger than slidWidth,we should
move the olderest value,then push the new,so need the queue
*/
class MovingAverage {
public:
    /** Initialize your data structure here. */
    MovingAverage(int size):slideWidth(size) {
        totalSum = 0;
    }
    
    double next(int val) {
        int valOut = 0;
        if (slideWindowVals.size() >= slideWidth)
        {
            totalSum  -= slideWindowVals.front();
            slideWindowVals.pop();
        }
        slideWindowVals.push(val);
        totalSum += val;

        return totalSum / slideWindowVals.size();
    }
private:
    queue<int> slideWindowVals;
    int slideWidth;
    double totalSum = 0;
};
